package koby99;

import java.util.List;
import java.util.ArrayList;

public class J04_Collection {

	// 콜렉션 collection
	//	객체지향 기반 프로그램 작성시
	// 종종 같은 종류의 객체의 묶음group이나
	// 다른 종류의 객체묶음과 함께 쓰는때가 있음
	
	// 앞서 배운 배열은 같은 종류의 객체 묶음이지만,
	// 유연성이 부족하고, 크기 조정도 안되고
	// 다른종류의 객체도 가질 수 없음
	
	// 다행히 자바에는 이러한 종류의 객체를 쉽게 
	// 다룰 수 있도록 인터페이스와 클래스를 제공
	//	그것은 바로 Collection 프레임워크임...!

	// Collection은 다른 종류들로 구성된 객체들의 묶음을 의미
	// 또 다른 말로 용기container 라고도 하는데,
	// 각 요소를 저장, 검색, 조작하는 메서드를 제공
	
	// Collection <-  Set, List, Queue
	// List <- ArrayList  단순 저장에 보통 이거
	// Map <- AbstractMap, SortedMep   검색 빨리![map중 hashmap을 마니쓴당
	// AbstractMap <- HashMap	
	// Iterator[하나끄내서 조회], Comparator[비교]
	
	// 이들 대부분은 java.util 페키지에 포함됨
	
	// List - 동적 배열
	// Collection의 가장 인기있는 하위 인터페이스임
	// ArrayList는 List의 가장 자주사용하는 구현 클래스
	// List는 자료를 순서대로 저장하는 특성을 가짐
	// FIFO : first in first out 선입선출
	// 또한, 데이터를 중복으로도 저장가능
	// 단, Set은 중복허용 불가!
	// add 메서드를 통해 데이터를 List의 맨 끝에 추가
	
	// 지네릭 generic
	// collection 을 배울때 generic 을 빼 놓으면
	// 불완전하게 collection을 배우는 것임
	//	collection 을 사용할때 발생할 수 있는
	// 컴파일 시 엄격한 자료형을 검사를 지원
	// 또한, collection 을 다룰때 대부분의
	// downcastion을 제거하고 사용할 수 있음
	// 또한, C++에서 제공하는 클래스 템플릿을
	// 작성 할 수 있께 해 줌 (고급)
	
	// 지네릭에서는
	// 매개변수 자료형 parameterized type을 이용해서
	// collection 요소의 자료형을 지정함
	// 메서드의 매개변수는 ()안에 사용하는 것처럼
	// collection에서는 <>안에 매개변수자료형을 사용
	// List<String> result = null;
	
	public static void main(String[] args) {
		List a = new ArrayList();
		a.add(1111);
		a.add('수');
		a.add(123.456);
		a.add("김태희");
		a.add(new J03_MemberVO());
		
		System.out.println(a);
		
		// ArrayList에 저장된 객체를 하나씩 꺼내 출력
		System.out.println( a.get(0));
		System.out.println( a.get(1));
		System.out.println( a.get(2));
		System.out.println( a.get(3));
		System.out.println( a.get(4));
		
		// ArrayList에 저장된 객체를 하나씩 꺼내
		// 변수에 따로저장
		// 이유 : ArrayList에 객체를 저장할때는
		// 대상이 무엇이든간에 무조건 Object형으로 저장됨
		// 따라서, ArrayList에 저장된 객체를
		// 꺼낼때는 객체의 자료형에 맞춰
		// downcasting이 필요 (JDK 5 이전)
		
		int num = (int) a.get(0);
		char chr = (char) a.get(1);
		float floatnum = (float)a.get(2);
		String str = (String)a.get(3);

		// 하지만, 이렇게 해도 컴파일 오류는 나지않는다.
		int str2 = (int)a.get(3); 		//string인데 int 넣었을경우
		char str3 = (char)a.get(3);	//string인데 char 넣었을경우
		//그러나, 실행하면 오류가 나게된다.
		System.out.println(str2 +str3);
		//이렇게되는건 Object형은 좀 쩌는 녀석이라서 다변가능하기 때문.[아임유어빠덜]
		//그렇기 때문에 나중에 오류를 찾기 어렵다는 단점이 있다.[타입채킹이 제대로 이뤄지지 않누]
		//이때문에 나온게 지네릭이라는 녀석!
		
		//지네릭을 사용했을 경우
		List<String>abc = new ArrayList();
		// ㄴ= abc라는 콜렉션(동적배열)에는 String 형식의 값만 추가가능하다는 의미이다.
//		List<String>abc = new ArrayList<String>(); JDK1.7이전에는 이리써야함
//		abc.add(123);			//자료형 검사후 오류 표시
//		abc.add('a');
		abc.add("김태희");	//정상처리
		
		String xyz = abc.get(0);
		
		List<J03_MemberVO> results = new ArrayList<J03_MemberVO>();
		// MemberVO 에 있는 자료만 추가가능 하단 소리다.
		
		//지네릭을 사용할 경우 다운케스팅(형변환)을 할 필요가 없다
		
		
		
		
		
	}
	
}
